#include "mySort.h"
#include <iostream>
#include <string>

// 构造函数：初始化 origin 为 NULL
MySort::MySort()
{
    this->origin = NULL;
}

// 构造函数：初始化 num 和 origin
MySort::MySort(int num, int *origin)
{
    this->num = num;
    this->origin = origin;
}

// 析构函数：目前没有清理内存的操作（已注释掉的 delete 操作不执行）
MySort::~MySort()
{
    /*delete this->origin;
    this->origin = NULL;*/
}

// 用于交换两个整数的函数
void MySort::changeSwap(int &a, int &b)
{
    int temp = 0;
    temp = a;
    a = b;
    b = temp;
}

// 将当前数组的数字以字符串形式输出
string MySort::printNum()
{
    string s;
    // 遍历数组中的每个元素并转为字符形式
    for (int i = 0; i < this->num; i++)
    {
        s += (char)(this->origin[i] + '0');  // 将整数转为字符
        if (i != this->num - 1)
            s += " ";  // 每个数字后添加空格，除了最后一个
    }
    return s;  // 返回字符串
}

// 奇偶排序算法
string MySort::paritySort()
{
    string s;
    int n = this->num;
    bool sorted = false;  // 标记是否排序完成
    while (!sorted)  // 如果未排序好，继续循环
    {
        sorted = true;
        // 奇数索引元素和后面元素比较，交换
        for (int i = 1; i < n - 1; i += 2)
        {
            if (this->origin[i] > this->origin[i + 1])  // 如果当前元素大于下一个元素
            {
                this->changeSwap(this->origin[i], this->origin[i + 1]);  // 交换
                s += this->printNum();  // 打印当前数组
                s += "\n";  // 换行
                sorted = false;  // 设置为未排序，继续下一轮排序
            }
        }
        // 如果数组长度是奇数，检查最后两个元素
        if (n % 2 != 0 && this->origin[n - 1] > this->origin[n - 2])
        {
            this->changeSwap(this->origin[n - 1], this->origin[n - 2]);
            sorted = false;
        }
        // 偶数索引元素和后面元素比较，交换
        for (int i = 0; i < n - 1; i += 2)
        {
            if (this->origin[i] > this->origin[i + 1])
            {
                this->changeSwap(this->origin[i], this->origin[i + 1]);
                s += this->printNum();
                s += "\n";
                sorted = false;
            }
        }
    }
    return s;  // 返回排序过程中的每一步数组变化
}

// 冒泡排序算法
string MySort::bubbleSort()
{
    string s;
    int low = 0;
    int high = this->num - 1;
    bool flag = true;  // 标记是否需要继续排序
    while (low < high && flag)  // 如果排序尚未完成
    {
        flag = false;  // 初始设置 flag 为 false，若发生交换则置为 true
        // 从低到高方向进行比较和交换
        for (int i = low; i < high; i++)
        {
            if (this->origin[i] > this->origin[i + 1])  // 如果当前元素大于下一个元素
            {
                this->changeSwap(this->origin[i], this->origin[i + 1]);  // 交换
                s += this->printNum();  // 打印当前数组
                s += "\n";  // 换行
            }
            flag = true;  // 如果交换了元素，设置 flag 为 true
        }
        high--;  // 高索引减小
        // 从高到低方向进行比较和交换
        for (int i = high; i > low; i--)
        {
            if (this->origin[i] < this->origin[i - 1])  // 如果当前元素小于前一个元素
            {
                this->changeSwap(this->origin[i], this->origin[i - 1]);  // 交换
                s += this->printNum();  // 打印当前数组
                s += "\n";  // 换行
            }
            flag = true;  // 如果交换了元素，设置 flag 为 true
        }
        low++;  // 低索引增大
    }
    return s;  // 返回排序过程中的每一步数组变化
}